import { Injectable } from '@angular/core';
import { Observable } from 'rxjs';

@Injectable({
  providedIn: 'root'
})
export class CheeseToolService {

  ///////////////////////数据相关//////////////////////////////
  //深克隆
  async structuralClone(obj: any) {
    return new Promise(resolve => {
      const { port1, port2 } = new MessageChannel();
      port2.onmessage = ev => resolve(ev.data);
      port1.postMessage(obj);
    });
  }


  /**
 * 等待某个条件成立后，执行指定的函数
 * 通过多次尝试来等待一个机会，如果在指定时间内条件未满足，则抛出错误
 * 
 * @param func 待执行的函数，当条件满足时会调用此函数
 * @param cond 检查的条件的回调函数，当此条件返回true时，会执行func
 * @param totalTime 总的等待时间，默认为2000毫秒，如果在总时间内条件未满足，则抛出错误
 * 
 * 示例：
 *const func = () => {
 *  this.mapShowGeom()
 *}
 *const cond = () => {
 *  return this.map
 *}
 *this.cs.executeOnCondition(func, cond, 5000)
 */
  executeOnCondition(func: Function, cond: Function, totalTime: number = 2000) {
    const totalAttenpt = 10
    const onetime = totalTime / totalAttenpt//一共给10次机会

    let attemptCount = 0;
    console.log(cond())
    if (!cond()) {
      const checkIt = () => {
        attemptCount++;
        if (cond()) {
          func()
        } else if (attemptCount <= totalAttenpt) {
          setTimeout(checkIt, onetime);
        } else {
          console.error(`哒咩，尝试了${totalTime}毫秒，还是没达到条件`)
          throw new Error(`哒咩，尝试了${totalTime}毫秒，还是没达到条件`);
        }
      };
      checkIt(); // 开始第一次检查
    } else {
      func()
    }
  }

    /**
   * 模拟数据
   * @param data 模拟返回的值
   * @param delay 延迟(默认0.5s)
   * @returns 
   */
    mockData(data: any, delay?: number) {
      if (!delay) delay = 500
      return new Observable(observer => {
        setTimeout(() => {
          observer.next({
            "code": 10001,
            "message": "成功",
            "data": data,
            "timestamp": 1739955611656
          });
          observer.complete();
        }, delay);
      });
      // return this.mockData(
      //   [{
      // "pac": "51", 
      // "pacName": "省本级", 
      // "impPlanCount": 0, 
      // "voltotalSum": 0, 
      // "unit": "万m³" 
      // }], 
      // )
    }
  

}
